package jrain.utils.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import jrain.utils.lang.StringUtils;

/**
 * <pre>
 * 作者：489088214@qq.com 
 * 描述： 集合工具类
 * </pre>
 */
@SuppressWarnings("unchecked")
public class CollectionUtils {

	/**
	 * 是否为空
	 * @param list 集合对象
	 * @return 是否为空
	 */
	public static boolean isEmpty(Collection<?> list) {
		return list == null || list.size() == 0;
	}

	/**
	 * 字符串转Set 默认分隔符逗号
	 * @param str 字符串
	 * @return Set
	 */
	public static Set<String> valueOfSet(String str) {
		return valueOfSet(str, ",");
	}

	/**
	 * 字符串转Set
	 * @param str 字符串
	 * @param split 分隔符
	 * @return Set
	 */
	public static Set<String> valueOfSet(String str, String split) {
		Set<String> set = new HashSet<String>();
		str = StringUtils.trimNull(str);
		if (!StringUtils.isEmpty(str)) {
			String[] strs = str.split(split);
			if (!StringUtils.isEmpty(strs)) {
				for (String string : strs) {
					string = StringUtils.trimNull(string);
					if (!StringUtils.isEmpty(string)) {
						set.add(string);
					}
				}
			}
		}
		return set;
	}

	/**
	 * 字符串转List 默认分隔符逗号
	 * @param str 字符串
	 * @return List
	 */
	public static List<String> valueOfList(String str) {
		return valueOfList(str, ",");
	}

	/**
	 * 字符串转List
	 * @param str 字符串
	 * @param split 分隔符
	 * @return List
	 */
	public static List<String> valueOfList(String str, String split) {
		List<String> list = new ArrayList<String>();
		str = StringUtils.trimNull(str);
		if (!StringUtils.isEmpty(str)) {
			String[] strs = str.split(split);
			if (!StringUtils.isEmpty(strs)) {
				for (String string : strs) {
					string = StringUtils.trimNull(string);
					if (!StringUtils.isEmpty(string)) {
						list.add(string);
					}
				}
			}
		}
		return list;
	}

	/**
	 * 克隆Map对象
	 * @param map Map对象
	 * @return 克隆后Map对象
	 */
	@SuppressWarnings("rawtypes")
	public static Map cloneMap(Map map) {
		Map rsMap = new HashMap();
		Set<Object> set = map.keySet();
		for (Object object : set) {
			Object valueObj = map.get(object);
			if (valueObj != null) {
				if (valueObj instanceof Map) {
					rsMap.put(object, cloneMap((Map) valueObj));
				} else if (valueObj instanceof List) {
					rsMap.put(object, cloneList((List) valueObj));
				} else {
					rsMap.put(object, valueObj);
				}
			} else {
				rsMap.put(object, valueObj);
			}
		}
		return rsMap;
	}

	/**
	 * 克隆List对象
	 * @param list List对象
	 * @return 克隆后的List
	 */
	@SuppressWarnings("rawtypes")
	public static List cloneList(List list) {
		List rsList = new ArrayList();
		for (Object object : list) {
			if (object instanceof List) {
				rsList.add(cloneList((List) object));
			} else if (object instanceof Map) {
				rsList.add(cloneMap((Map) object));
			} else {
				rsList.add(object);
			}
		}
		return rsList;
	}

	/**
	 * 可变参数转List
	 * @param params 参数
	 * @return List
	 */
	public static List<Object> objsToList(Object... params) {
		List<Object> list = new ArrayList<Object>();
		if (params != null) {
			for (Object t : params) {
				list.add(t);
			}
		}
		return list;
	}

	/**
	 * 字符数组合并
	 * @param list 数组
	 * @return 字符串
	 */
	public static String joinList(List<String> list) {
		return joinList(list, ",");
	}

	/**
	 * 字符数组合并
	 * @param list 数组
	 * @param flag 分隔符
	 * @return 字符串
	 */
	public static String joinList(List<String> list, String flag) {
		if (list != null && list.size() > 0) {
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < list.size(); i++) {
				sb.append(list.get(i));
				if (i != list.size() - 1) {
					sb.append(flag);
				}
			}
			return sb.toString();
		}
		return "";
	}
}
